/*
 * @copyright: Huang Ding
 * @Author: ding-cx
 * @Date: 2021-03-10 11:32:58
 * @LastEditors: ding-cx
 * @LastEditTime: 2021-04-07 11:33:50
 * @Description: file content
 */

import { Application, IBoot, WsOnMessage } from "egg";

export default class AppInitBoot implements IBoot {
  app: Application;
  constructor(app: Application) {
    this.app = app;
  }

  async didReady() {
    /** app准备就绪时添加初始化ws访问接口。将能监听agent进程发过来的事件。 */
    this.app.ws.init();//重复init不会重复调用。
    const wss = this.app.ws.init();
    // 然后的业务代码中，如service、controller里可以使用app.ws.emit发送消息。
    // 监听消息不能重复监听，否则会重复发送，可在本app引导类中做监听。

    wss.on("send-file", (ws: WsOnMessage) => {
      console.log(ws.data);
    });
    // 测试业务层事件使用。前端传来event:abc的事件。
    wss.on("abc", (ws: WsOnMessage, data: WsOnMessage["data"]) => {
      // console.log(ws.wsuid);
      // console.log(this.app.ws.pools);
      // ws.response("123");

      // 在收到前端事件之后，可以使用ws直接回复信息。
      setTimeout(() => {
        wss.pools.forEach((item) => {
          if (item === ws.wsuid) {
            ws.send(ws.wsuid, "helloo,我给自己发了信息。");
          } else {
            ws.send(item, "hello,我给你发了信息！只给你了发了信息哟。");
          }
        });
      }, 2000);
      setTimeout(() => {
        ws.broadcast({ is: "broadcast" });
      }, 4000);
      setTimeout(() => {
        ws.sendRoom({ is: "room" });
      }, 6000);
      ws.res(data.data.msg);

      // 自主通知前端，则需要事件名等。示例：给某个固定wsuid的人发信息。
      // setTimeout(() => {
      //   // console.log(11111);
      //   wss.emit("abc", ws.wsuid, "haha,我是给自己wsuid发的信息。");
      // }, 8000);
    });
  }
}
